/*
 * NodoHoja.h
 *
 *  Created on: 03/04/2010
 *      Author: administrador
 */

#ifndef NODOHOJA_H_
#define NODOHOJA_H_

#include "INodo.h"
#include <sstream>
#include <iostream>
#include "Archivo.h"

using namespace std;

class NodoHoja: public INodo {

private:

	/* vector de Elementos */
	vector<Elemento*> elementos;

	int nodoSiguiente;

	int nodoAnterior;

	/* Saca el elemento de la posicion indicada del vector y lo reorganiza */
	void borrarElemento(Elemento* elemento, int posicion);

	int getTamanioRegistroVariable(Elemento *elemento);

	/* Actualiza nodoSiguiente y nodoAnterior cuando se agrega un nuevo nodo */
	void actualizarNodosContiguos(INodo* nodoNuevo);


public:

	int verificarSeparador();
	NodoHoja(int idNodo =-1, char tipo = Comun);
	
	void vaciarNodo();
//	NodoHoja(int idNodo, char tipo = Comun);

	virtual ~NodoHoja();

	Elemento* getElemento(int posicion);

	/* Agrega elemento al final del vector de elementos */
	void agregarElemento(Elemento* elemento);

	/* Agrega elemento en el vector de elementos en la posicion indicada */
	void agregarElemento(Elemento* elemento, int posicion);

	int getNodoSiguiente();

	int getNodoAnterior();

	void setNodoSiguiente(int idNodo);

	void setNodoAnterior(int idNodo);

	bool insertarElemento(Elemento* elemento);

	bool quitarElemento(int clave);

	bool modificarElemento(int clave, string* nuevoValor);

	Elemento* buscarElemento(int clave);

	/* Retorna el elemento siguiente al elemento actual del arbol */
	Elemento* getElementoSiguiente();

	/* Retorna el elemento anterior al elemento actual del arbol */
	Elemento* getElementoAnterior();

	void partirNodoEnOverflow(int &claveAPromover, INodo* nodoNuevo);

	bool balancearNodoEnUnderflow(int clavePadre,INodo* nodoHermano);

	bool fusionarNodoEnUnderflow(int clavePadre,INodo* nodoHermano);

	int getClaveAPromover();

	NodoHoja* clonar();

	void printNodo(ofstream* archivoSalida, int cantidadNiveles);
	
	void serializar();

	void hidratar();
};



#endif /* NODOHOJA_H_ */
